{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9f080814-00a9-486e-82dd-ee081793b056",
   "metadata": {},
   "outputs": [],
   "source": [
    "### 使用提示词完成任务"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "8fdd044c-46fb-404c-846f-420cc41f19a2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "==== Prompt ====\n",
      "\n",
      "# 目标\n",
      "\n",
      "你的任务是识别用户对手机流量套餐产品的选择条件。\n",
      "每种流量套餐产品包含三个属性：名称，月费价格，月流量。\n",
      "根据用户输入，识别用户在上述三种属性上的需求是什么。\n",
      "\n",
      "\n",
      "# 用户输入\n",
      "\n",
      "办个100G的套餐。\n",
      "\n",
      "\n",
      "================\n",
      "根据用户输入“办个100G的套餐”，可以识别用户对手机流量套餐产品的选择条件如下：\n",
      "\n",
      "1. **月流量需求**：用户明确需要**100G**的月流量。\n",
      "2. **名称和月费价格**：用户没有提及具体的套餐名称或月费价格，因此这两项需求不明确。\n",
      "\n",
      "总结：用户的主要需求是月流量为100G的套餐，其他属性（名称和月费价格）未指定。\n"
     ]
    }
   ],
   "source": [
    "# 导入依赖库\n",
    "import dashscope\n",
    "import os\n",
    "\n",
    "# 从环境变量中获取 API Key\n",
    "dashscope.api_key = os.getenv('DASHSCOPE_API_KEY')\n",
    "\n",
    "# 基于 prompt 生成文本\n",
    "# 使用 deepseek-v3 模型\n",
    "def get_completion(prompt, model=\"deepseek-v3\"):\n",
    "    messages = [{\"role\": \"user\", \"content\": prompt}]    # 将 prompt 作为用户输入\n",
    "    response = dashscope.Generation.call(\n",
    "        model=model,\n",
    "        messages=messages,\n",
    "        result_format='message',  # 将输出设置为message形式\n",
    "        temperature=0,  # 模型输出的随机性，0 表示随机性最小\n",
    "    )\n",
    "    return response.output.choices[0].message.content  # 返回模型生成的文本\n",
    "    \n",
    "# 任务描述\n",
    "instruction = \"\"\"\n",
    "你的任务是识别用户对手机流量套餐产品的选择条件。\n",
    "每种流量套餐产品包含三个属性：名称，月费价格，月流量。\n",
    "根据用户输入，识别用户在上述三种属性上的需求是什么。\n",
    "\"\"\"\n",
    "\n",
    "# 用户输入\n",
    "input_text = \"\"\"\n",
    "办个100G的套餐。\n",
    "\"\"\"\n",
    "\n",
    "# prompt 模版。instruction 和 input_text 会被替换为上面的内容\n",
    "prompt = f\"\"\"\n",
    "# 目标\n",
    "{instruction}\n",
    "\n",
    "# 用户输入\n",
    "{input_text}\n",
    "\"\"\"\n",
    "\n",
    "print(\"==== Prompt ====\")\n",
    "print(prompt)\n",
    "print(\"================\")\n",
    "\n",
    "# 调用大模型\n",
    "response = get_completion(prompt)\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4016166-d3b2-4ae3-a9cf-3725742d83ec",
   "metadata": {},
   "source": [
    "### JSON格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ff756a92-cccb-440f-a192-c39cfbacc3cb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "```json\n",
      "{\n",
      "  \"名称\": null,\n",
      "  \"月费价格\": null,\n",
      "  \"月流量\": \"100G\"\n",
      "}\n",
      "```\n"
     ]
    }
   ],
   "source": [
    "# 输出格式\n",
    "output_format = \"\"\"\n",
    "以 JSON 格式输出\n",
    "\"\"\"\n",
    "\n",
    "# 稍微调整下咒语，加入输出格式\n",
    "prompt = f\"\"\"\n",
    "# 目标\n",
    "{instruction}\n",
    "\n",
    "# 输出格式\n",
    "{output_format}\n",
    "\n",
    "# 用户输入\n",
    "{input_text}\n",
    "\"\"\"\n",
    "\n",
    "# 调用大模型，指定用 JSON mode 输出\n",
    "response = get_completion(prompt)\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44d3e30b-fda2-4d78-9fa8-56b0c36519d0",
   "metadata": {},
   "source": [
    "### CoT示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d6bcfc8a-f2fb-4e02-8357-26454827bfbb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Y\n"
     ]
    }
   ],
   "source": [
    "instruction = \"\"\"\n",
    "给定一段用户与手机流量套餐客服的对话，。\n",
    "你的任务是判断客服的回答是否符合下面的规范：\n",
    "\n",
    "- 必须有礼貌\n",
    "- 必须用官方口吻，不能使用网络用语\n",
    "- 介绍套餐时，必须准确提及产品名称、月费价格和月流量总量。上述信息缺失一项或多项，或信息与事实不符，都算信息不准确\n",
    "- 不可以是话题终结者\n",
    "\n",
    "已知产品包括：\n",
    "\n",
    "经济套餐：月费50元，月流量10G\n",
    "畅游套餐：月费180元，月流量100G\n",
    "无限套餐：月费300元，月流量1000G\n",
    "校园套餐：月费150元，月流量200G，限在校学生办理\n",
    "\"\"\"\n",
    "\n",
    "# 输出描述\n",
    "output_format = \"\"\"\n",
    "如果符合规范，输出：Y\n",
    "如果不符合规范，输出：N\n",
    "\"\"\"\n",
    "\n",
    "context = \"\"\"\n",
    "用户：你们有什么流量大的套餐\n",
    "客服：亲，我们现在正在推广无限套餐，每月300元就可以享受1000G流量，您感兴趣吗？\n",
    "\"\"\"\n",
    "\n",
    "cot = \"\"\n",
    "#cot = \"请一步一步分析对话\"\n",
    "\n",
    "prompt = f\"\"\"\n",
    "# 目标\n",
    "{instruction}\n",
    "{cot}\n",
    "\n",
    "# 输出格式\n",
    "{output_format}\n",
    "\n",
    "# 对话上下文\n",
    "{context}\n",
    "\"\"\"\n",
    "\n",
    "response = get_completion(prompt)\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2be29190-d711-40e2-9c37-153d564480dc",
   "metadata": {},
   "source": [
    "### 使用Prompt调优Prompt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "3310fe94-d4b3-4d3b-9d52-89c9f2047973",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "### 提示词\n",
      "\"您好！我是手机流量套餐客服代表小瓜，很高兴为您服务。我们目前有以下几种流量套餐供您选择：  \n",
      "1. **经济套餐**：月费50元，包含10G流量，适合日常轻度使用。  \n",
      "2. **畅游套餐**：月费180元，包含100G流量，适合经常上网的用户。  \n",
      "3. **无限套餐**：月费300元，包含1000G流量，适合重度流量使用者。  \n",
      "4. **校园套餐**：月费150元，包含200G流量，仅限在校生办理。  \n",
      "请问您目前的流量使用情况如何？或者您更倾向于哪种类型的套餐？我可以根据您的需求为您推荐最合适的方案。\"\n",
      "\n",
      "### 优化建议\n",
      "1. **明确用户需求**：提示词中应更直接地询问用户的具体需求，例如每月流量使用量、预算范围或是否有特殊限制（如校园套餐）。这样可以更快地缩小选择范围，提高效率。  \n",
      "2. **增加个性化推荐**：在提示词中加入一些引导性问题，例如“您是否经常观看视频或玩游戏？”或“您是否需要国际漫游服务？”这样可以更精准地推荐套餐。  \n",
      "3. **简化语言**：虽然提示词已经比较清晰，但可以进一步简化语言，避免用户感到信息过载。例如，可以将套餐信息以更简洁的方式呈现，或者分步骤引导用户选择。  \n",
      "\n",
      "### 问题示例\n",
      "1. 您每月的流量使用量大概是多少？  \n",
      "2. 您的预算范围是多少？  \n",
      "3. 您是否有特殊需求，例如国际漫游或仅限校园使用的套餐？\n"
     ]
    }
   ],
   "source": [
    "user_prompt = \"\"\"\n",
    "做一个手机流量套餐的客服代表，叫小瓜。可以帮助用户选择最合适的流量套餐产品。可以选择的套餐包括：\n",
    "经济套餐，月费50元，10G流量；\n",
    "畅游套餐，月费180元，100G流量；\n",
    "无限套餐，月费300元，1000G流量；\n",
    "校园套餐，月费150元，200G流量，仅限在校生。\"\"\"\n",
    "\n",
    "instruction = \"\"\"\n",
    "你是一名专业的提示词创作者。你的目标是帮助我根据需求打造更好的提示词。\n",
    "\n",
    "你将生成以下部分：\n",
    "提示词：{根据我的需求提供更好的提示词}\n",
    "优化建议：{用简练段落分析如何改进提示词，需给出严格批判性建议}\n",
    "问题示例：{提出最多3个问题，以用于和用户更好的交流}\n",
    "\"\"\"\n",
    "\n",
    "prompt = f\"\"\"\n",
    "# 目标\n",
    "{instruction}\n",
    "\n",
    "# 用户提示词\n",
    "{user_prompt}\n",
    "\"\"\"\n",
    "\n",
    "response = get_completion(prompt)\n",
    "print(response)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
